// 通用数据存储文件

#ifndef COM_USER_DATA_H
#define COM_USER_DATA_H

#include "cm_common.h" // 包含通用头文件
#include "utils.h"     // 包含通用工具类头文件

// 枚举变量 逆变器品牌厂家标识
typedef enum
{
    // 0 固德威
    FactoryCODE_GDW,
    // 1 锦浪
    FactoryCODE_JL,
    // 2 首航
    FactoryCODE_SH,
    // 3 古瑞瓦特，适用：古瑞瓦特-新款-逆变器外部通信协议V1.20 新款协议 2
    FactoryCODE_Growatt_USB,
    // 4 阳光电源
    FactoryCODE_YG,
    // 5 奥太
    FactoryCODE_AoTai,
    // 6 正泰
    FactoryCODE_ZhengTai,
    // 7 禾望
    FactoryCODE_HeWang,
    // 8 华为
    FactoryCODE_HUAWEI,
    // 9 爱世维
    FactoryCODE_ASW,
    // 10古瑞瓦特旧款db9，适用：古瑞瓦特-老款协议  -S系列 Modbus RS485 RTU协议V3.13
    FactoryCODE_Growatt_DB9,
    // 11 科士达
    FactoryCODE_KSG,
    // 12 上能
    FactoryCODE_SN,
    // 13 麦田电力
    FactoryCODE_MaiTian,
    // 14 三晶 115200波特率 232
    FactoryCODE_SAJ,
    // 15 德业逆变器
    FactoryCODE_DY,
    FactoryCODE_MAX // 用于判断数组边界

} FactoryCODE;

// ---------------- 逆变器数据结构体 ----------------
typedef struct
{
    FactoryCODE factory_code; // 逆变器厂家
    uint8_t adder;            // 逆变器映射地址 从机地址 - 标识要通信的Modbus设备
    // 逆变电压单位0.1V
    uint16_t PhV_phsA; // 有效 A 相电压
    uint16_t PhV_phsB; // 有效 B 相电压
    uint16_t PhV_phsC; // 有效 C 相电压
    // 逆变输出电流 单位: 1A
    uint16_t I_phsA; // A相电流
    uint16_t I_phsB; // B相电流
    uint16_t I_phsC; // C相电流

} Pvinterver_t;

// 全局逆变器数据变量声
extern Pvinterver_t gInverterData;

// 打印逆变器数据
void Pvinterver_Print(void);

// 逆变器点表结构体

// 逆变器数据解析函数
//  定义解析函数指针类型 - 用于处理Modbus响应数据
//  参数1: 指向响应数据缓冲区的指针
//  参数2: 响应数据的长度
typedef void (*ParseFunc)(uint8_t *, uint16_t);

// Modbus轮询项目结构体 - 定义单个Modbus设备的轮询配置
typedef struct
{
    uint8_t func;      // 功能码 - 要执行的Modbus操作类型（如03/04/06/10）
    uint16_t reg;      // 起始寄存器地址 - 要读取或写入的第一个寄存器地址
    uint16_t num;      // 寄存器数量 - 要读取或写入的寄存器数量
    uint32_t interval; // 轮询间隔 - 两次轮询之间的时间间隔(毫秒)
    uint8_t retry;     // 重试次数 - 请求失败后重试的最大次数
    ParseFunc parse;   // 解析函数指针 - 指向处理此设备响应数据的回调函数
    uint8_t data[128]; // 数据缓冲区 - 用于存储06/10功能码写寄存器操作的数据
} ModbusPollItem_t;

// 声明一个结构体，用于将厂家代码与对应的轮询表关联起来
typedef struct
{
    FactoryCODE code;
    const ModbusPollItem_t *poll_table;
    uint8_t poll_count;
} FactoryConfig_t;

// 外部声明所有品牌的轮询表和配置
// 固德威
extern const ModbusPollItem_t pollTable_GDW[];
extern const uint8_t pollCount_GDW;
// 锦浪
extern const ModbusPollItem_t pollTable_JL[]; // 锦浪轮询表
extern const uint8_t pollCount_JL;            // 锦浪轮询项数量
void Parse_JL_01(uint8_t *buf, uint16_t len); // 锦浪轮询项1解析函数
void Parse_JL_02(uint8_t *buf, uint16_t len); // 锦浪轮询项2解析函数

// 阳光电源
extern const ModbusPollItem_t pollTable_YG[];
extern const uint8_t pollCount_YG;
// 外部声明全局配置映射表
extern const FactoryConfig_t factory_config_map[];

// 解析函数声明 (示例)
// 固德威
void Parse_GDW_PhaseVoltage(uint8_t *buf, uint16_t len);
void Parse_GDW_PhaseCurrent(uint8_t *buf, uint16_t len);

// 阳光电源
void Parse_YG_SystemStatus(uint8_t *buf, uint16_t len);

#endif // COM_USER_DATA_H
